#include <iostream>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <cstring>
#include <cstdio>
#include <cerrno>
#include <unistd.h>
#include <cstdlib>
using namespace std;

#define PATH_NAME "/home/hyr/linux_code/linux19" // 路径名
#define PROJ_ID 0x16                             // 整数标识符
#define SIZE 4096                                // 共享内存大小

// 创建一个全新的共享内存
const int flag = IPC_CREAT | IPC_EXCL | 0666;

key_t CreateKey()
{
    key_t key = ftok(PATH_NAME, PROJ_ID);
    if (key < 0)
    {
        std::cerr << "ftok:" << strerror(errno) << std::endl;
        exit(-1);
    }
    return key;
}

int main()
{
    key_t key = CreateKey();

    // 创建共享内存
    int shmid = shmget(key, SIZE, flag);
    if (shmid < 0)
    {
        perror("shmget");
        return 1;
    }

    printf("key: %x\n", key);
    printf("shmid: %d\n", shmid);

    cout << "attach begin!" << endl;
    sleep(1);

    // 将共享内和自己的进程产生关联（attach）
    char *str = (char *)shmat(shmid, nullptr, 0);
    if (str == (char *)-1)
    {
        perror("shmat");
        return 1;
    }

    sleep(1);
    cout << "attach end!" << endl;

    // 将共享内存与进程去关联
    cout << "detach begin!" << endl;
    sleep(1);
    shmdt(str);
    cout << "detach end!" << endl;
    sleep(1);

    // 释放共享内存
    sleep(1);
    shmctl(shmid,IPC_RMID,nullptr);
    sleep(1);

    return 0;
}